using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._3DAnalystTools
{
    /// <summary>
    /// <para>TIN Contour</para>
    /// <para>Generates contours from a TIN surface.</para>
    /// <para>从 TIN 曲面生成轮廓。</para>
    /// </summary>    
    [DisplayName("TIN Contour")]
    public class TinContour : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public TinContour()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_tin">
        /// <para>Input TIN</para>
        /// <para>The surface from which the contours will be interpolated.</para>
        /// <para>要从中插值轮廓的曲面。</para>
        /// </param>
        /// <param name="_out_feature_class">
        /// <para>Output Feature Class</para>
        /// <para>The output feature class.</para>
        /// <para>输出要素类。</para>
        /// </param>
        /// <param name="_interval">
        /// <para>Contour Interval</para>
        /// <para>The interval between the contours.</para>
        /// <para>等值线之间的间隔。</para>
        /// </param>
        public TinContour(object _in_tin, object _out_feature_class, double? _interval)
        {
            this._in_tin = _in_tin;
            this._out_feature_class = _out_feature_class;
            this._interval = _interval;
        }
        public override string ToolboxName => "3D Analyst Tools";

        public override string ToolName => "TIN Contour";

        public override string CallName => "3d.TinContour";

        public override List<string> AcceptEnvironments => ["XYDomain", "XYResolution", "XYTolerance", "extent", "outputCoordinateSystem", "scratchWorkspace", "workspace"];

        public override object[] ParameterInfo => [_in_tin, _out_feature_class, _interval, _base_contour, _contour_field, _contour_field_precision, _index_interval, _index_interval_field, _z_factor];

        /// <summary>
        /// <para>Input TIN</para>
        /// <para>The surface from which the contours will be interpolated.</para>
        /// <para>要从中插值轮廓的曲面。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input TIN")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_tin { get; set; }


        /// <summary>
        /// <para>Output Feature Class</para>
        /// <para>The output feature class.</para>
        /// <para>输出要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Feature Class")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_feature_class { get; set; }


        /// <summary>
        /// <para>Contour Interval</para>
        /// <para>The interval between the contours.</para>
        /// <para>等值线之间的间隔。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Contour Interval")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public double? _interval { get; set; }


        /// <summary>
        /// <para>Base Contour</para>
        /// <para>Along with the index interval, the base height is used to determine what contours are produced. The base height is a starting point from which the index interval is either added or subtracted. By default, the base contour is 0.0.</para>
        /// <para>与索引间隔一起，底高用于确定生成的等值线。底高是添加或减去索引间隔的起点。默认情况下，基础等值线为 0.0。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Base Contour")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double? _base_contour { get; set; } = null;


        /// <summary>
        /// <para>Contour Field</para>
        /// <para>The field containing contour values.</para>
        /// <para>包含等值线值的字段。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Contour Field")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _contour_field { get; set; } = null;


        /// <summary>
        /// <para>Contour Field Precision</para>
        /// <para>The precision of the contour field. Zero specifies an integer, and the numbers 1–9 indicate how many decimal places the field will contain. By default, the field will be an integer (0).</para>
        /// <para>等值线场的精度。零指定一个整数，数字 1-9 表示字段将包含多少位小数。默认情况下，该字段将为整数 （0）。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Contour Field Precision")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public long _contour_field_precision { get; set; } = 0;


        /// <summary>
        /// <para>Index Interval</para>
        /// <para>The difference, in Z units, between index contours. The value specified should be evenly divisible by the contour interval. Typically, it’s five times greater. Use of this parameter adds an attribute field to the output feature class that’s used to differentiate index contours from regular contours.</para>
        /// <para>索引等值线之间的差值（以 Z 为单位）。指定的值应能被等值线间隔整除。通常，它是它的五倍。使用此参数会向输出要素类添加一个属性字段，用于区分索引等值线和常规等值线。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Index Interval")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double? _index_interval { get; set; } = null;


        /// <summary>
        /// <para>Index Interval Field</para>
        /// <para>The name of the field used to record whether a contour is a regular or an index contour. By default, the value is ‘Index’.</para>
        /// <para>用于记录等值线是正则等值线还是索引等值线的字段的名称。默认情况下，该值为“Index”。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Index Interval Field")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _index_interval_field { get; set; } = null;


        /// <summary>
        /// <para>Z Factor</para>
        /// <para>Specifies a factor by which to multiply the surface heights. Used to convert z units to x and y units.</para>
        /// <para>指定曲面高度乘以的系数。用于将 z 单位转换为 x 和 y 单位。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Z Factor")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _z_factor { get; set; } = 1;


        public TinContour SetEnv(object XYDomain = null, object XYResolution = null, object XYTolerance = null, object extent = null, object outputCoordinateSystem = null, object scratchWorkspace = null, object workspace = null)
        {
            base.SetEnv(XYDomain: XYDomain, XYResolution: XYResolution, XYTolerance: XYTolerance, extent: extent, outputCoordinateSystem: outputCoordinateSystem, scratchWorkspace: scratchWorkspace, workspace: workspace);
            return this;
        }

    }

}